import express from "express";
import bodyParser from "body-parser";
import OpenAI from "openai"; // 复用 OpenAI SDK（七牛兼容该格式）
import dotenv from 'dotenv';
import fetch from "node-fetch"; // 用 fetch 调 TTS
import multer from "multer"; // 处理文件上传
import fs from "fs"; // 读写文件
import ffmpeg from "fluent-ffmpeg";

// 加载环境变量（.env 中的 API_KEY 需替换为七牛的密钥）
dotenv.config();

const app = express();
app.use(bodyParser.json());

// 1. 初始化 OpenAI SDK（关键：指定七牛的 baseURL 和七牛 API Key）
const openai = new OpenAI({
  apiKey: process.env.QINIU_API_KEY, // ！！必须替换为七牛云提供的 API Key（非 OpenAI 密钥）
  baseURL: "https://openai.qiniu.com/v1", // 七牛接口的 baseURL（对应示例的域名前缀）
  timeout: 60000, // 延长超时（七牛接口可能有一定延迟，避免超时错误）
});

// 2. 调整 /api/ai 接口逻辑（匹配七牛的 model 和 messages 结构）
app.post("/api/ai", async (req, res) => {
  try {
    const { prompt } = req.body; // 前端传入的用户提问（保持原逻辑，无需改前端）

    // 3. 调用七牛接口：修改 model 为七牛支持的模型，补充 system 角色（匹配七牛示例）
    const chatCompletion = await openai.chat.completions.create({
      stream: false, // 七牛示例中显式指定 stream: false，需添加（关闭流式响应）
      model: "gpt-oss-20b", // 七牛示例的模型名称（必须替换，不能用 gpt-3.5-turbo）
      messages: [
        // 补充 system 角色（七牛示例有该配置，用于定义 AI 行为，可根据需求修改内容）
        { role: "system", content: "You are a helpful assistant." },
        // 保留用户的提问（prompt 来自前端传入）
        { role: "user", content: prompt }
      ],
    });

    // 4. 解析七牛返回的响应（格式与 OpenAI 兼容，无需大幅修改）
    const answer = chatCompletion.choices[0].message.content;
    res.json({ answer }); // 向前端返回 AI 回答

  } catch (err) {
    // 增强错误日志（方便排查七牛接口的问题，如密钥错误、模型不存在等）
    console.error("七牛接口调用失败：", {
      errorMessage: err.message,
      errorCode: err.code,
      status: err.status, // 状态码（如 401 是密钥错误，404 是模型不存在）
    });
    // 向前端返回更具体的错误提示
    res.status(500).json({ 
      error: "七牛 LLM 服务调用失败",
      detail: err.message || "未知错误"
    });
  }
});

// 显式设置 ffmpeg 可执行文件路径
ffmpeg.setFfmpegPath("D:/ffmpeg/ffmpeg-2025-09-25-git-9970dc32bf-full_build/bin/ffmpeg.exe"); 

const QINIU_API_KEY = process.env.QINIU_API_KEY; // .env 中配置
const QINIU_API_BASE = "https://openai.qiniu.com/v1";

// 文件上传用临时目录
const upload = multer({ dest: "uploads/" });

// 语音识别接口
app.post("/api/asr", upload.single("audio"), async (req, res) => {
  try {
    const webmPath = req.file.path;
    const mp3Path = `${webmPath}.mp3`;

    // 1. 用 ffmpeg 把 webm 转 mp3
    await new Promise((resolve, reject) => {
      ffmpeg(webmPath)
        .toFormat("mp3")
        .on("end", resolve)
        .on("error", reject)
        .save(mp3Path);
    });

    // 2. 读取 mp3 并转 base64
    const audioData = fs.readFileSync(mp3Path);
    const base64Audio = audioData.toString("base64");

    // 3. 调七牛 ASR
    const resp = await fetch(`${QINIU_API_BASE}/voice/asr`, {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${QINIU_API_KEY}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        model: "asr",
        audio: {
          format: "mp3",       // 转码后就是 mp3
          content: base64Audio
        }
      })
    });

    const data = await resp.json();

    // 4. 清理临时文件
    fs.unlinkSync(webmPath);
    fs.unlinkSync(mp3Path);

    res.json({ text: data?.data?.result?.text || "" });
  } catch (err) {
    console.error("ASR 调用失败：", err.message);
    res.status(500).json({ error: err.message });
  }
});

// 监听 3000 端口（保持原逻辑，前端代理仍指向 3000 端口）
app.listen(3000, () => {
  console.log("AI API server running on 3000!");
});